import { throttle } from 'lodash';
import { useRef } from 'react';
import useCreation from '../use-creation';
import { ThrottleOptions} from '../use-throttle/throttleOptions';

type Fn = (...args: any) => any
interface ReturnValue<T extends Fn>{
    run: T;
    cancel: () => void;
    flush: () => void;
}

export default <T extends Fn>(fn: T, options?: ThrottleOptions): ReturnValue<T> => {
    const fnRef = useRef(fn)
    fnRef.current = fn

    const wait = options?.wait ?? 1000

    const throttled = useCreation(
        () => throttle(
            (...args: any) => {
                fnRef.current(...args)
            },
            wait,
            options
        ),
        []
    )
    return {
        run: (throttled as any) as T,
        cancel: throttled.cancel,
        flush: throttled.flush,
    }
}